from django.db import models
from datetime import datetime
# Create your models here.
from django.urls import reverse


class Category(models.Model):
    """分类表
    1)一个类代表一个数据库表，表名默认是appname_classname.  blog_category
    2)Django的数据库模型默认会添加id作为主键
    """
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Tag(models.Model):
    """分类表"""
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Post(models.Model):
    """博客表"""
    # 文章标题
    title = models.CharField(max_length=100)
    # 文章正文,我们使用了 TextField。
    body = models.TextField()
    # 这两个列分别表示文章的创建时间和最后一次修改时间,存储时间的字段用 DateTimeField 类型。
    # auto_now_add: 添加时的时间，更新对象时不会有变动，相当于给时间做了一次定位。
    # auto_now:无论你是添加还是修改对象，时间为你添加或者修改的时间，相当于更新时间。
    created_time = models.DateTimeField(auto_now_add=True)  # datetime.now()
    modified_time = models.DateTimeField(auto_now=True)
    # 文章摘要,可以没有文章摘要,但默认情况下 CharField 要求我们必须存入数据,否则就会报错。
    # 指定 CharField 的 blank=True 参数值后就可以允许空值了。
    excerpt = models.CharField(max_length=200, blank=True)

    views = models.PositiveIntegerField(default=0)
    # on_delete=False在Django1.x版本默认是不级联删除的，可以不做设置. Django2.x一定要自行指定.
    category = models.ForeignKey(Category, on_delete=False)
    # blank=True标签可以不做设置
    tags = models.ManyToManyField(Tag, blank=True)
    # 文章作者，这里 User 是从 django.contrib.auth.models 导入的。
    # 因为我们规定一篇文章只能有一个作者，而一个作者可能会写多篇文章，因此这是一对多的关联关系，和
    #Category类似。
    # author = models.ForeignKey(User)
    # 自定义get_absolute_url方法
    # 记得从django.urls中导入reverse函数
    def get_absolute_url(self):
        # reverse相当于Flask里的url_for，根据视图函数名称反向获取对应的路由地址
        return reverse('detail',kwargs={'id':self.id})
    def increase_views(self):
        self.views += 1
        self.save(update_fields=['views'])

    def __str__(self):
        return self.title
